#include "protocole_serveur.h"
#include "protocole_com.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
 * attend l'arrivée d'un message et traite la data a l'aide des autre fonctions
 * [ 000 Contact ]              -> serveur_ajout()
 * [ 001 Contact Identifiant ]  -> serveur_modification()
 * [ 011 Nom ]                  -> serveur_consultation()
 * [ 010 Identifiant ]          -> serveur_suppression()
 */
int serveur_ecoute( liste annuaire)
{
    char header[5];
    int err;


    /*
       recupération du header 

*/

    if( (err = com_recoit_message(header)))
    {
	if( err == 1)
	    fprintf(stderr, "ECOUTE : Deconnexion.\n");
	return 1;
	fprintf(stderr, "ECOUTE : je ne comprend pas ce protocole.\n");
	return -1;
    }
    /*    traitement du reste du message en fonction du header
    */
    if (header [0] != '0'&& 4 != strlen(header))
    {
	fprintf(stderr, "je suis un serveur pas un client !!!\n");
	return -2;
    }
    puts("J'ai bien recu un protocole de server.\n");
    /* 0** */
    switch(header[1])
    {
	/* 00* */
	case '0' :
	    switch(header[2])
	    {
		/* 000 */
		case '0' :

		    if( (err = serveur_ajout( annuaire)) )
		    {
			if( err == 1)
			    fprintf(stderr, "ECOUTE : Deconnexion.\n");
			return 1;
		    }
		    break;

		    /* 001 */
		case '1' :

		    if( (err = serveur_modification( annuaire)) )
		    {
			if( err == 1)
			    fprintf(stderr, "ECOUTE : Deconnexion.\n");
			return 1;
		    }
		    break;
		default :
			printf("ECOUTE : probleme de protocole\nECOUTE : Deconnexion.\n");
		    return 2;
	    }
	    break;
	    /* 01* */
	case '1' :

	    switch(header[2])
	    {
		/* 010 */
		case '0' :

		    if( (err = serveur_suppression( annuaire)) )
		    {
			if( err == 1)
			    fprintf(stderr, "ECOUTE : Deconnexion.\n");
			return 1;
		    }
		    break;
		    /* 011 */
		case '1' :

		    if( (err = serveur_consultation( annuaire)) )
		    {
			if( err == 1)
			    fprintf(stderr, "ECOUTE : Deconnexion.\n");
			return 1;
		    }
		    break;
		default :
			printf("ECOUTE : probleme de protocole\nECOUTE : Deconnexion.\n");
		    return 2;
	    }
	    break;
	default :
			printf("ECOUTE : probleme de protocole\nECOUTE : Deconnexion.\n");
		    return 2;
    }
    return 0;

}

/*
 * ajoute un nouveau contact à l'annuaire
 * message à recevoir   :   [ 000 Contact ]
 * message à envoyer    :   [ 1001 "Contact Bien ajouté" ]
 * message d'erreur     :   [ 1000 "CODE_ERREUR" "description" ]
 * */
int serveur_ajout( liste annuaire )
{
    pFiche fiche;

    puts("J'ai recu 000 pour ajouter.\n");
    if(com_recoit_structure(&fiche))
	return 1;
    printf("J'ai recu %s pour ajout.\n", fiche->c.nom);
    ajouterfiche(annuaire, fiche);
if(   com_envoie_message ("1001 Contact Bien ajouté\n"))
return 1;

    return 0;
}
/*
 * modifie un contact présent dans l'annuaire
 * message à recevoir   :   [ 001 Contact Idenfifiant ]
 * message à envoyer    :   [ 1001 "Contact bien modifié" ]
 * message d'erreur     :   [ 1000 "CODE_ERREUR" "description" ]
 */
int serveur_modification( liste annuaire )
{
    pFiche fiche;
    puts("J'ai recu 001 pour modifier.\n");
    if(com_recoit_structure(&fiche))
	return 1;
    printf("J'ai recu %s pour modification.\n", fiche->c.nom);
    modifierfiche(annuaire, fiche);
    if(com_envoie_message ("1001 Contact bien modifié\n"))
	return 1;
    return 0;
}
/*
 * consulte les contact présent dans l'annuaire à l'aide du nom
 * message à recevoir   :   [ 011 NOM ]
 * message à envoyer    :   [ 101 Contact Idenfifiant ]
 *                          ... 
 *                          [ 101 Contact Idenfifiant ]
 *                          [ 1001 "Liste des contact envoyé" ]
 * message d'erreur     :   [ 1000 "CODE_ERREUR" "description" ]
 */
int serveur_consultation( liste annuaire )
{
    char nom[32];
    liste l;

    puts("J'ai recu 011 pour consulter.\n");
    if (  com_recoit_message(nom))
	return 1;

    nom[strlen(nom)-1]='\0';	
    printf("%s est demande.\n", nom);
    puts("je consulte.\n");
    l = consulterfiche(annuaire, nom);
    if (l->cel == NULL)
    {
	printf("Contact non trouve.\n");
	if	(com_envoie_message("1000 Contact inexistant\n"))
	    return 1;
	return 0;
    }

    afficherListe(l);

    while (l->cel != NULL)
    {
	if(com_envoie_message("101\n"))
	    return 1;
	printf("J'envoie la fiche : %s.\n", l->cel->f->c.nom);
	if(com_envoie_structure (l->cel->f))
	    return 1;
	l->cel = l->cel->suiv;
    }
    if(com_envoie_message ("1001 Liste des contact envoyé\n"))
	return 1;
    return 0;
}
/*
 * supprime un contact de l'annuaire a l'aide de l'identifiant
 * message à recevoir   :   [ 010 Idenfifiant ]
 * message à envoyer    :   [ 1001 "Contact supprimé"
 * message d'erreur     :   [ 1000 "CODE_ERREUR" "description" ]
 */
int serveur_suppression( liste annuaire)
{
    Idenfifiant i;
    int retour;
    char nom[32];
    puts("J'ai recu 010 pour supprimer.\n");
    if(com_recoit_message(nom))
	return 1;
    i.id = atoi(nom);

    printf("J'ai recu %s pour supprimer (avant atoi).\n", nom);
    printf("J'ai recu %d pour supprimer (apres atoi).\n", i.id);
    retour = supprimerfiche (annuaire, &i);
    if (retour != 0)
    {
	if(	com_envoie_message("1000 Erreur : Identifiant no valide.\n"))
	    return 1;
	return 0;
    }
    else 
    {
	if(	com_envoie_message("1001 Contact supprimé\n"))
	    return 1;
	return 0;
    }
}
